/*
 * Copyright 2002-2012 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.core.type.classreading;

import java.io.IOException;

import org.springframework.core.io.Resource;

/**
 * Factory interface for {@link MetadataReader} instances.
 * Allows for caching a MetadataReader per original resource.
 *
 * @author Juergen Hoeller
 * @since 2.5
 * @see SimpleMetadataReaderFactory
 * @see CachingMetadataReaderFactory
 */

/**
 MetadataReaderFactory 是 MetadataReader 实例的工厂接口，允许为每个原始资源缓存一个 MetadataReader

 2. 继承树和实现类
 	MetadataReaderFactory 是一个接口，没有父接口，其主要实现类包括：
 实现类：
	 SimpleMetadataReaderFactory：MetadataReaderFactory 的简单实现，每次调用都创建新的 MetadataReader 实例
	 CachingMetadataReaderFactory：MetadataReaderFactory 的缓存实现，为每个资源缓存 MetadataReader 实例以提高性能
 3. 与其他类和接口的关系
	 与 MetadataReader：工厂关系，MetadataReaderFactory 创建 MetadataReader 实例
	 与 SimpleMetadataReaderFactory：实现关系，是其基本实现
	 与 CachingMetadataReaderFactory：实现关系，是其缓存实现
	 与 Resource：通过 getMetadataReader(Resource) 方法使用 Resource 作为输入
	 与类路径扫描组件：被 ClassPathScanningCandidateComponentProvider 等类使用来创建 MetadataReader 实例
 4. 总结
	 MetadataReaderFactory 是Spring框架中用于创建 MetadataReader 实例的工厂接口。
 它提供了两种方式来获取 MetadataReader：通过类名或通过 Resource 对象。
 该接口有两个主要实现：SimpleMetadataReaderFactory（每次都创建新实例）和 CachingMetadataReaderFactory（缓存实例以提高性能）。
 这个工厂模式使得Spring可以灵活地管理 MetadataReader 实例的创建和复用。
 5. 应用场景
	 类路径扫描：Spring框架在扫描类路径寻找候选组件时使用 MetadataReaderFactory 创建 MetadataReader 实例
	 组件注册：在 ClassPathScanningCandidateComponentProvider 中使用，用于读取类的元数据以判断是否应该注册为Spring组件
	 条件注解评估：在处理 @Conditional 注解时，使用 MetadataReaderFactory 创建的 MetadataReader 来读取类的元数据
	 自动配置：Spring Boot的自动配置机制使用 MetadataReaderFactory 快速分析类文件
	 AOP处理：在确定哪些类需要代理时，使用 MetadataReaderFactory 创建的 MetadataReader 分析类的注解信息
	 性能优化：通过 CachingMetadataReaderFactory 实现缓存，避免重复创建 MetadataReader 实例，提高性能
	 这些应用场景都利用了 MetadataReaderFactory 提供的统一接口来创建 MetadataReader 实例，使得Spring可以灵活地选择是否缓存实例以平衡性能和内存使用。
 */
public interface MetadataReaderFactory {

	/**
	 * Obtain a MetadataReader for the given class name.
	 * @param className the class name (to be resolved to a ".class" file)
	 * @return a holder for the ClassReader instance (never {@code null})
	 * @throws IOException in case of I/O failure
	 */
	MetadataReader getMetadataReader(String className) throws IOException;

	/**
	 * Obtain a MetadataReader for the given resource.
	 * @param resource the resource (pointing to a ".class" file)
	 * @return a holder for the ClassReader instance (never {@code null})
	 * @throws IOException in case of I/O failure
	 */
	MetadataReader getMetadataReader(Resource resource) throws IOException;

}
